package cn.highedu.config;

import cn.highedu.security.AuthFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;

// @Configuration
// @EnableWebSecurity //Spring MVC中启用web安全，Spring Boot 会自动配置
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//
//    @Autowired
//    private AuthFilter authFilter;


    /**
     * 配置web安全，绕过Spring Security 的过滤器链条
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.debug(true).ignoring().mvcMatchers("/actuator/**");
    }

//    /**
//     * 重写， configure(HttpSecurity http) 添加 过滤器链条的规则
//     * @param http
//     * @throws Exception
//     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // authorize 授权 Request请求 Matcher 匹配 hasRole 有角色
        // /admin/* 匹配一层，如可以匹配："/admin/index.html","/admin/add.html"
        // /admin/** 匹配多层，如可以匹配："/admin/index.html","/admin/add.html", "/admin/databases/index.html"
        http.authorizeRequests()
                //"/about/**","/signup/**" 这些路径全部放过, 不登录可以看
                // 经过了安全过滤器，被设置为放过
                .mvcMatchers("/about/**","/signup/**").permitAll()
                // http授权请求匹配了“/admin/**”时候，需要用户有 ADMIN 角色
                .mvcMatchers("/admin/**").hasRole("ADMIN") //必须是管理员
                // http url 配置有先后次序，先设置的规则优先处理，具体匹配规则需要在前面处理
                .mvcMatchers("/accounts/edit_password.html").hasRole("USER")
                .mvcMatchers("/accounts/**").hasRole("ADMIN")
                //登录就可以访问其他的页面
                .anyRequest().authenticated() //其他请求需要登录, 也就是登录就可以访问
                //使用表单方式登录，如果没有登录就打开登录表单
                .and().formLogin();
        // 注册过滤器
        // http.addFilterAfter(authFilter, UsernamePasswordAuthenticationFilter.class);
    }

    /**
     * 配置 AuthenticationManage 用于支持编程式登录
     * @return 认证管理器
     * @throws Exception 异常
     */
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {

        return super.authenticationManagerBean();
    }
}









